package logicaUtenteReg;

import java.util.ArrayList;
import java.util.Date;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.jboss.ejb3.annotation.RemoteBinding;

import dominio.Feedback;
import dominio.RichiestaAiuto;
import eccezioni.NessunFeedbackException;
import eccezioni.NoRicAiutoCompletateException;
import eccezioni.NoRichiesteAiutoException;

/**
 * Session Bean implementation class GestoreFeedback
 */
@Stateless
@RemoteBinding(jndiBinding="GestoreFeedbackRemote")
public class GestoreFeedback implements GestoreFeedbackRemote {
	@PersistenceContext(unitName="swimv2") private EntityManager manager;

    /**
     * Default constructor. 
     */
    public GestoreFeedback() {
        // TODO Auto-generated constructor stub
    }

	@Override
	public ArrayList<Feedback> listaFeedback(String username) throws NessunFeedbackException {
		
		String s = "FROM Feedback f WHERE f.destinatario=:username";
		Query q = manager.createQuery(s);
		q.setParameter("username", username);
		
		if(q.getResultList().size() == 0) {
			
			throw new NessunFeedbackException();
			
		}
		
		else {
			
			@SuppressWarnings("unchecked")
			ArrayList<Feedback> ris = new ArrayList<Feedback>(q.getResultList());
			return ris;
			
		}
		
	}

	@Override
	public ArrayList<RichiestaAiuto> listaRicAiuto(String mittente, String destinatario) throws NoRichiesteAiutoException, NoRicAiutoCompletateException {
		
		String s = "FROM RichiestaAiuto r WHERE r.richiedente=:mittente and r.destinatario=:destinatario";
		Query q = manager.createQuery(s);
		q.setParameter("mittente", mittente);
		q.setParameter("destinatario", destinatario);
		
		@SuppressWarnings("unchecked")
		ArrayList<RichiestaAiuto> richieste = (ArrayList<RichiestaAiuto>) q.getResultList();
		
		if(richieste.size() == 0) {
			
			throw new NoRichiesteAiutoException();
			
		}
		else {
			
			s = "FROM RichiestaAiuto r WHERE r.richiedente=:mittente and r.destinatario=:destinatario and esito=2";
			q = manager.createQuery(s);
			q.setParameter("mittente", mittente);
			q.setParameter("destinatario", destinatario);
			
			@SuppressWarnings("unchecked")
			ArrayList<RichiestaAiuto> ricCompletate = (ArrayList<RichiestaAiuto>) q.getResultList();
			
			if(ricCompletate.size() == 0) {
				
				throw new NoRicAiutoCompletateException();
				
			}
			else {
				
				return ricCompletate;
				
			}
			
		}
	
	}

	@Override
	public RichiestaAiuto cercaRichiesta(String richiedente, String destinatario, Date data) {
		
		String s = "FROM RichiestaAiuto r WHERE r.richiedente=:richiedente and r.destinatario=:destinatario and r.data=:data";
		Query q = manager.createQuery(s);
		q.setParameter("richiedente", richiedente);
		q.setParameter("destinatario", destinatario);
		q.setParameter("data", data);
		
		return (RichiestaAiuto) q.getSingleResult();
		
	}

	@Override
	public void eliminaRicAiuto(RichiestaAiuto richiesta) {
		
		String s = "DELETE FROM RichiestaAiuto r WHERE r.richiedente=:richiedente and r.destinatario=:destinatario and r.data=:data";
		Query q = manager.createQuery(s);
		q.setParameter("richiedente", richiesta.getRichiedente());
		q.setParameter("destinatario", richiesta.getDestinatario());
		q.setParameter("data", richiesta.getData());
		q.executeUpdate();
		manager.flush();
		
	}

	@Override
	public void rilasciaFeedback(Feedback feedback) {
		
		manager.persist(feedback);
		
	}

}
